jad
反编译指定已加载类的源码
jad
命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑;
- 在 Arthas Console 上,反编译出来的源码是带语法高亮的,阅读更方便
- 当然,反编译出来的 java 代码可能会存在语法错误,但不影响你进行阅读理解
反编绎时只显示源代码
默认情况下,反编译结果里会带有ClassLoader
信息,通过--source-only
选项,可以只打印源代码。方便和mc/redefine命令结合使用。
反编译UserController
,保存到 /tmp/UserController.java
文件里。
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
反编译指定的函数
$ jad demo.MathGame main
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
Location:
/private/tmp/arthas-demo.jar
public static void main(String[] args) throws InterruptedException {
MathGame game = new MathGame();
do {
game.run();
TimeUnit.SECONDS.sleep(1L);
} while (true);
}
Affect(row-cnt:1) cost in 228 ms.
mc
Memory Compiler/内存编译器,编译
.java
文件生成.class
。
mc /tmp/Test.java
可以通过-c
参数指定classloader:
mc -c 327a647b /tmp/Test.java
可以通过-d
命令指定输出目录:
mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java
编译生成.class
文件之后,可以结合redefine命令实现热更新代码。
注意,mc命令有可能失败。如果编译失败可以在本地编译好
.class
文件,再上传到服务器。具体参考redefine命令说明。